package main

import (
	"encoding/json"

	"jlpay-sdk-go/pkg/jlpay/demo"
	"jlpay-sdk-go/pkg/jlpay/models/trans/c2b"
	"jlpay-sdk-go/pkg/jlpay/models/trans/dto"
	servicec2b "jlpay-sdk-go/pkg/jlpay/services/trans/c2b"
	"jlpay-sdk-go/pkg/jlpay/utils"
)

// ==================== 常量定义 ====================

// 支付类型常量
const (
	PAY_TYPE_WECHAT = "wxpay"    // 微信支付
	PAY_TYPE_ALIPAY = "alipay"   // 支付宝支付
	PAY_TYPE_UNION  = "unionpay" // 银联支付
)

// 限制支付方式常量
const (
	LIMIT_PAY_NO_CREDIT   = "no_credit" // 不能使用信用卡
	LIMIT_PAY_CREDIT_ONLY = "credit"    // 只能使用信用卡
)

// 分期标识常量
const (
	HIRE_PURCHASE_NO  = "0" // 不分期
	HIRE_PURCHASE_YES = "1" // 分期
)

// 构建商品详情数据
func buildGoodsData() *dto.GoodsDataDto {
	goodsData := dto.NewGoodsDataDto()

	// 添加商品详情
	goodsDetail1 := dto.NewGoodsDetailDto().
		SetGoodsId("001").
		SetGoodsName("测试商品1").
		SetQuantity("1").
		SetPrice("50")

	goodsDetail2 := dto.NewGoodsDetailDto().
		SetGoodsId("002").
		SetGoodsName("测试商品2").
		SetQuantity("1").
		SetPrice("50")

	goodsData.AddGoodsDetail(goodsDetail1).AddGoodsDetail(goodsDetail2)
	return goodsData
}

// 构建终端信息数据
func buildTerminalInfo() *dto.TerminalInfoDto {
	terminalInfo := dto.NewTerminalInfoDto()
	terminalInfo.SetDeviceType("01")
	return terminalInfo
}

// 构建二维码支付请求
func buildQrcodePayRequest() *c2b.QrcodePayRequest {
	request := c2b.NewQrcodePayRequest()

	// 设置请求参数
	request.SetMchID("849584358120018")
	request.SetTermNo("60131234")
	request.SetPayType(PAY_TYPE_WECHAT)
	request.SetOutTradeNo("ld201911023465530")
	request.SetPaymentValidTime("10")
	request.SetBody("测试商品")
	request.SetAttach("测试描述")
	request.SetTotalFee("100")
	request.SetLimitPay(LIMIT_PAY_NO_CREDIT)
	request.SetIsHirePurchase(HIRE_PURCHASE_NO)
	request.SetHirePurchaseNum("3")
	request.SetHirePurchaseSellerPercent("0")
	request.SetRemark("测试备注")
	request.SetNotifyURL("www.baidu.com")
	request.SetOpUserID("test_user")
	request.SetOpShopID("GD_SZ_001")
	request.SetDeviceInfo("N50007A8890")
	request.SetMchCreateIP("127.0.0.1")
	request.SetLongitude("116.397128")
	request.SetLatitude("39.916527")
	request.SetSubAppid("wxid_129752pfasf1671")
	request.SetGoodsTag("test_tag")

	// 设置商品详情
	goodsData := buildGoodsData()
	request.SetGoodsData(goodsData)

	// 设置终端信息
	terminalInfo := buildTerminalInfo()
	request.SetTerminalInfo(terminalInfo)

	return request
}

// 二维码支付示例
func qrcodePayDemo(qrcodePayService *servicec2b.QrcodePayService) {
	// 创建二维码支付请求
	request := buildQrcodePayRequest()

	// 序列化请求数据并打印
	requestMap, _ := request.ToMap()
	requestJSON, _ := json.Marshal(requestMap)
	utils.Debugf("二维码支付请求数据: %s", string(requestJSON))

	// 发送请求
	response, err := qrcodePayService.QrcodePay(request)
	if err != nil {
		utils.Errorf("二维码支付请求失败: %v", err)
		return
	}

	// 处理响应 - 使用BaseResponse接口的HandleResponse方法
	response.HandleResponse("二维码支付")
}

func main() {
	// 设置日志级别为info，显示详细的调试信息
	utils.SetLogLevel("info")

	utils.Info("=============================")
	utils.Info("===== 二维码支付示例 开始 =====")
	utils.Info("=============================")

	// 创建配置对象和二维码支付服务
	config := demo.CreateDemoConfig()
	qrcodePayService := servicec2b.NewQrcodePayService(config)

	qrcodePayDemo(qrcodePayService)

	utils.Info("=============================")
	utils.Info("===== 二维码支付示例执行完毕 =====")
	utils.Info("=============================")
}
